MySql基本语法

1 基本命令

查看
show databases;
show tables;

创建
create database basename charset utf8;

删除
drop database basename;

建表语句:
create table stu(
snum int,
sname varchar(10)
)engine myisam charset utf8;

删除表:
drop table stu;

重命名表:
rename table stu to newstu;

插入数据:
insert into newstu values
(1,”wang”),
(2,”lin”);

查看内容
select * from newstu;

清空表数据
truncate newstu;

2 表的增删改查

输出sql文件
tee D:\xxx.sql
建表语句
create table class(
id int primary key auto_increment,
sname varchar(10) not null default ‘’,
gender char(1) not null default ‘’,
company varchar(20) not null default ‘’,
salary decimal(6,2) not null default 0.00,
fanbu smallint not null default 0
)engine myisam charset utf8;

建表过程就是对各个字段进行声明的过程

查看表结构
desc class;

添加
insert into class
(id,sname,gender,company,salary,fanbu)
values
(4,’xxx’,’x’,’xxxx’,1111.11,111);

修改数据值
update tablename
set fanbu=999
where id=6 and sname=‘xxx’;

修改表结构
加列:
alter table 表名 add 列名称 列类型 列参数;(加的列处于表的最后)
alter table 表名 add 列名称 列类型 列参数 after 某列;
alter table 表名 add 列名称 列类型 列参数 first;
删除列:
alter table 表名 drop 列名;
修改列参数:
alter table 表名 modify 列名 列类型 列参数;
修改列名和列类型:
alter table 表名 change 旧列名 新列名 列类型 列参数;

删除
delete from表名
where expr

查找
select sname,company,salary from class
where id=3

【注】select 表示选择整行
【记忆】:select 列名 from 表名 where 表达式
【查询模型】:把列看做变量,遍历每一行,对哪一行where表达式为真,哪一行就被选出
*where表达式

where后接表达式,表达式的类型可以是:
in(a,s,d,f)
not in (q,e)
between a and b
and
or
like
【注】like用于模糊查询
例如 where name like ‘xxx%’;
%匹配任意字符
_匹配任意单一字符

3 查询进阶

group by
group by用于结合聚合函数,根据一个或对多个列对结果集进行分组
常用聚合函数有:
max
min
sum
avg
count

having
与where直接对表进行操作不同
having+表达式用于对表的结果集进行操作

where group having 综合运用
要求:查询出2门及2门以上不及格者的平均成绩(难度在于所有成绩的平均成绩)
mysql> insert into result
-> values
-> (‘张三’,’数学’,90),
-> (‘张三’,’语文’,50),
-> (‘张三’,’地理’,40),
-> (‘李四’,’语文’,55),
-> (‘李四’,’政治’,45),
-> (‘王五’,’政治’,38)
-> ;
mysql> select * from result;
+————+————-+———-+
| name | subject | score |
+————+————-+———-+
| 张三 | 数学 | 90 |
| 张三 | 语文 | 50 |
| 张三 | 地理 | 40 |
| 李四 | 语文 | 55 |
| 李四 | 政治 | 45 |
| 王五 | 政治 | 38 |
+————+————-+———-+
mysql> select name,avg(score),sum(score<60) as="" c="" -=""> from result
-> group by name
-> having c>=2;
+————+——————+———+
| name | avg(score) | c |
+————+——————+———+
| 张三 | 60.0000 | 2 |
| 李四 | 50.0000 | 2 |
+————+——————+———+

order by
order by对结果集进行排序,order需要在where、group和having后执行。
“order by 列名 desc”为降序排序;“order by 列名 asc ”为升序排序。

limit
limit用于限制结果条数,语句放在最后。
语法为:limit[offset] N
offset:偏移量———->跳过offset行
N————->取出条目

4 子查询

where型子查询
把内层查询结果作为外层查询的比较条件,即sql语句的嵌套
例:
SELECT goods_id,goods_name FROM goods
WHERE goods_id IN
(SELECT MAX(goods_id) FROM goods GROUP BY cat_id);

from型子查询
内层sql的查询结果作为一张临时表提供给外层sql再次查询
例:
select * from
(select goods_id,goods_name,cat_id from goods
order by cat_id asc,goods_id desc) as tmp
group by cat_id;

5 连接

全连接(两表相乘):
select * from table1,table2;

左连接
假设A表在左(不动),B表在A表的右边滑动
A表与B表通过一个关系来筛选B的表的行
A left join B on 条件 条件为真,则B表对应的行取出
例:
select goods_id,goods_name,goods.cat_id,cat_name
from goods left join category
on goods.cat_id = category.cat_id;

右连接
A left join B 等价于 B right join A

内连接
A inner join B 就是左右连接取交集

union:
union合并2条或多条语句的结果。
语法:sql1 union sql2